/**
 * @desc 检测指定网站的https引用错误
 * 1. 安装依赖 npm i puppeteer
 * 2. 配置目标网站地址targetSite，
 * 3. 如有需忽略的目录(例如cms与论坛等)，添加到ignoreDir数组中
 * 4. 执行脚本 node index.js
 */
const puppeteer = require('puppeteer');
const fs = require('fs');
const log = require('./log');

console.log = log;

const targetSite = new URL('https://tl.changyou.com/'),
    ignoreDir = ['/xtl/', '/data/'];


let visitedUrls = [],
    output = [];

async function captureConsoleOutput(browser, url) {
    // 检查URL是否已经访问过
    if (visitedUrls.includes(url)) {
        return;
    }

    console.log(`开始抓取 ${url}`);

    // 记录已访问的URL
    visitedUrls.push(url);

    // 创建新页面
    const page = await browser.newPage();

    // 挂载监听事件捕获console输出
    let info = [];
    page.on('console', msg => {
        // 指定收集的错误类型
        if (msg.type() === 'error' && msg.text().indexOf('Mixed Content') !== -1) {
            info.push(msg.text());
        }
    });

    // 访问URL，等待网络活动结束
    await page.goto(url, { waitUntil: 'networkidle0' });
    await page.waitForTimeout(3000); //固定等待3秒是为了某些dom操作生成的链接

    // 获取页面上的所有链接
    const allLinks = await page.evaluate(() => {
        const anchors = Array.from(document.querySelectorAll('a'));
        return anchors.map(anchor => anchor.href);
    })
    let links = [];
    // 对链接进行过滤操作
    allLinks.map((href) => {
        if (href) {
            try {
                href = new URL(href);
                // 获取当前域名下非忽略文件夹的路径
                var check = ignoreDir.filter((dir) => {
                    return href.pathname.indexOf(dir) !== -1;
                });
                if (href.host === targetSite.host && !check.length) {
                    // 强制转化为https协议
                    href = 'https://' + href.host + href.pathname;
                    links.push(href)
                }
            } catch (error) {
                console.log('地址转化错误：', error);
            }
        }
    });
    console.log('当前页面抓取到的地址：\n',links);

    // 保存结果并关闭当前页面
    info.length && output.push(url);
    await page.close();

    // 递归访问所有链接
    for (let link of links) {
        await captureConsoleOutput(browser, link);
    }
}


(async () => {
    const browser = await puppeteer.launch({
        headless: false, // 是否开启浏览器页面显示 false显示 true不显示
        ignoreHTTPSErrors: true, // 忽略HTTPS错误
        defaultViewport: null,
    });
    await captureConsoleOutput(browser, targetSite.href, ignoreDir);
    await browser.close();

    console.log('检测结束');
    outputToJSON(output)
})();

function outputToJSON(result) {
    // 将数据写入JSON文件
    fs.writeFile('result.txt', result.join('\n'), (err) => {
        if (err) throw err;
        console.log('数据已成功导出为result.txt');
    });
}
